/**
 * 实现一个超时控制函数，为promise添加超时控制
 */

/**
 * Promise 超时控制
 * @param {Promise} promise - 要监听的 Promise
 * @param {number} timeoutMs - 超时时间(毫秒)
 * @param {string|Error} [timeoutError] - 超时时抛出的错误或错误信息
 * @returns {Promise} - 带有超时控制的 Promise
 */
function withTimeoutRequest(promise, timeoutMs, timeoutError = 'timeout') {
    return new Promise((resolve, reject) => {
        
        let timeoutId = setTimeout(() => {
            const error = typeof timeoutError === 'string' ? Error(timeoutError) : timeoutError;
            error.name = 'Timeout Error';
            reject(error);
        }, timeoutMs);

        promise
        .then(result => {
            clearTimeout(timeoutId);
            resolve(result);
        })
        .catch((error) => {
            clearTimeout(timeoutId);
            reject(error);            
        })
    });

}